/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.raitcon.hibernate.db;

import com.raitcon.hibernate.bean.Asignatura;
import com.raitcon.hibernate.bean.CronogramaEvaluacion;
import com.raitcon.hibernate.bean.DetalleNota;
import com.raitcon.hibernate.bean.HibernateSessionFactory;
import com.raitcon.hibernate.bean.MatriculaTemp;
import com.raitcon.hibernate.bean.Nota;
import com.raitcon.hibernate.bean.NotaMensualProm;
import com.raitcon.hibernate.factory.HibernateUtil;
import java.math.BigDecimal;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author Mike
 */
public class NotaDB {
    
    protected static Logger log = Logger.getLogger(NotaDB.class);
    private Session session = null;
    
    
    public NotaDB(){
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }
    
    
    
    
    public String insertOrUpdateNota(Nota nota, List<DetalleNota> detalleNota, Integer idOption,
            Nota notaSave, List<MatriculaTemp> listMatriculaTemp, Integer idAsignatura, Integer idCronogramaEval, Integer typeAsignature) {
        String result = "";
        Integer numRegProm=typeAsignature==1?4:3;
         System.out.println("metodo insertOrUpdate  nota");
         session = HibernateSessionFactory.getSession();
         System.out.println("session: " + session);
         System.out.println("Try");
         Transaction ts = session.beginTransaction();
        try {
             
            System.out.println("Transaction");
            if(notaSave!=null){
                
             System.out.println("Guardando registro nota id::"+notaSave.getIdNota());
                nota.setIdNota(notaSave.getIdNota());
                session.update(nota);   
                
                //Registramos los promedio de las notas del alumnos del un curso x mes(cronograma)
                
                for (MatriculaTemp mt : listMatriculaTemp) {
                     //NotaMensualPromDB notaMenProm=new NotaMensualPromDB();
                    // NotaMensualProm NotaMenPromUpdate= notaMenProm.findNotaMensualProm(mt.getMatricula().getAlumno().getIdAlumno(), 
                    //        idCronogramaEval, idAsignatura);
                    NotaMensualProm NotaMenPromUpdate=new NotaMensualProm();
                    NotaMenPromUpdate.setIdNotaMensualProm(mt.getIdNotaMensualProm());
                    NotaMenPromUpdate.setNota(nota);
                    NotaMenPromUpdate.setAlumno(mt.getMatricula().getAlumno());
                    NotaMenPromUpdate.setAsignatura(new Asignatura(idAsignatura));
                    NotaMenPromUpdate.setCronogramaEvaluacion(new CronogramaEvaluacion(idCronogramaEval));
                    //Double lngNotaProm=(new Double(mt.getDblNota4()+mt.getDblNota8()+mt.getDblNotaDoce()+ mt.getDblNotaDSeis())/numRegProm);
                    NotaMenPromUpdate.setPromC1(BigDecimal.valueOf(mt.getDblNota4()));
                    NotaMenPromUpdate.setPromC2(BigDecimal.valueOf(mt.getDblNota8()));
                    NotaMenPromUpdate.setPromC3(BigDecimal.valueOf(mt.getDblNotaDoce()));
                    NotaMenPromUpdate.setEtC1(BigDecimal.valueOf(mt.getEtC1()));
                    NotaMenPromUpdate.setEtC2(BigDecimal.valueOf(mt.getEtC2()!=null?mt.getEtC2():0));
                    NotaMenPromUpdate.setEtC3(BigDecimal.valueOf(mt.getEtC3()!=null?mt.getEtC3():0));
                    NotaMenPromUpdate.setPromAc1(BigDecimal.valueOf(mt.getDblNotaDSeis()!=null?mt.getDblNotaDSeis():0));
                    session.update(NotaMenPromUpdate);
                    System.out.println("Actualizando NotaMenPromUpdate id::"+NotaMenPromUpdate.getIdNotaMensualProm());
                }
            
            }
            else{
                 System.out.println("Insertando nuevo registro.... ");
                 session.save(nota);
                  //Registramos los promedio de las notas del alumnos del un curso x mes(cronograma)
                 
               for (MatriculaTemp mt : listMatriculaTemp) {
                    NotaMensualProm notaMensualProm=new NotaMensualProm();
                    notaMensualProm.setNota(nota);
                    notaMensualProm.setAlumno(mt.getMatricula().getAlumno());
                    notaMensualProm.setAsignatura(new Asignatura(idAsignatura));
                    notaMensualProm.setCronogramaEvaluacion(new CronogramaEvaluacion(idCronogramaEval));
                    //Double lngNotaProm=(new Double(mt.getDblNota4()+mt.getDblNota8()+mt.getDblNotaDoce()+ mt.getDblNotaDSeis())/numRegProm);
                    notaMensualProm.setPromC1(BigDecimal.valueOf(mt.getDblNota4()));
                    notaMensualProm.setPromC2(BigDecimal.valueOf(mt.getDblNota8()));
                    notaMensualProm.setPromC3(BigDecimal.valueOf(mt.getDblNotaDoce()));
                    notaMensualProm.setPromAc1(BigDecimal.valueOf(mt.getDblNotaDSeis()));
                    
                    notaMensualProm.setEtC1(BigDecimal.valueOf(mt.getEtC1()!=null?mt.getEtC1():0));
                    notaMensualProm.setEtC2(BigDecimal.valueOf(mt.getEtC2()!=null?mt.getEtC2():0));
                    notaMensualProm.setEtC3(BigDecimal.valueOf(mt.getEtC3()!=null?mt.getEtC3():0));
                    notaMensualProm.setPromAc1(BigDecimal.valueOf(mt.getDblNotaDSeis()!=null?mt.getDblNotaDSeis():0));
                    session.save(notaMensualProm);
                }
            }
                
            
           
            for(DetalleNota dt :detalleNota ){
                dt.setNota(nota);
                //DetalleNotaDB dtDB=new DetalleNotaDB();
                if(notaSave!=null){
                  session.update(dt);
                   System.out.println("actualiza detalle id:"+dt.getNota());
                }
                else{
                  session.save(dt);
                //dtDB.save(d, session);
                System.out.println("inserta detalle");
                }
             
            }
            ts.commit();
            System.out.println("Se guardó correctamente");
            result = "Se guardó exitosamente el registo nota id:"+nota.getIdNota();
            return result;
        } catch (HibernateException ex1) {
            System.out.println("HibernateException : " + ex1);
            ts.rollback();
            return "";
        } catch (Exception ex2) {
            System.out.println("Exception : " + ex2);
            ts.rollback();
            return "";
        } finally {
            session.close();
        }
    }
    
    
    public Nota findNota( Integer idCronEval,Integer idAsignatura, Integer idEmpleado,
            Integer idGrado, Integer idSeccion){
        
         log.info("Iniciando consulta de DetallNota...");
         Nota nota=null;
        try {
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Nota as nota  "
                    + "WHERE id_cronograma_evaluacion="+idCronEval+ " AND id_asignatura="+ idAsignatura+
                   " AND id_empleado="+idEmpleado +" AND id_grado="+idGrado+
                    " AND id_seccion="+idSeccion);

            nota=(Nota) q.uniqueResult();
             log.info("Consulta de detalle nota exitosa.");
             return nota;
        } catch (Exception e) {
            log.error("Error:" + e.getMessage());
            e.printStackTrace();
        } finally {
            session.close();
        }
        return nota;
    }
    
    
    public List<Object[]> listNotaLibreta( Integer idCronEval,Integer idAsignatura, Integer idEmpleado,
            Integer idGrado, Integer idSeccion){
        
         log.info("Iniciando consulta notas libreta");
        List<Object[]> listNota=null;
        try {
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Nota as n inner join n.detalleNotas");
                    

            listNota=q.list();
             log.info("Consulta de detalle nota exitosa.");
             return listNota;
        } catch (Exception e) {
            log.error("Error:" + e.getMessage());
            e.printStackTrace();
        } finally {
            session.close();
        }
        return listNota;
    }
    
    
    
    
}
